#include "mywifi.h"
#include "myhttp.h"
#include "clock.h"
static const char *TAG = "MY_WIFI";
const int WIFI_CONNECTED_BIT = BIT0;

static int s_retry_num = 0;

/*设置WIFI的 初始ssid password，后面会通过BLE来赋真正的ssid和pswd值*/
wifi_config_t wifi_config = {
    .sta = {
        .ssid = "prx",
        .password = "123456789",
    },
};

/*
 * wifi事件处理回调函数
 * ctx：参数
 * event：wifi事件
 */
static esp_err_t wifi_event_handler(void *ctx, system_event_t *event)
{
    //判断事件类型
    switch (event->event_id)
    {
    case SYSTEM_EVENT_STA_START:
        esp_wifi_connect(); //station已开始，可连接
        break;
    case SYSTEM_EVENT_STA_GOT_IP:
        //dhcp获取到ip
        ESP_LOGI(TAG, "got ip:%s",
                 ip4addr_ntoa(&event->event_info.got_ip.ip_info.ip));
        s_retry_num = 0;    //重试清零
        xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT); //wifi事件组标志位置位

        break;
    case SYSTEM_EVENT_STA_DISCONNECTED:
    {
        //wifi断开，尝试重连
        esp_wifi_connect();
        xEventGroupClearBits(s_wifi_event_group, WIFI_CONNECTED_BIT);   //清除标志位
        s_retry_num++;  //重试次数++
        ESP_LOGI(TAG,"connect to the AP fail\n");
        ESP_LOGI(TAG,"retry to connect to the AP");
        break;
    }
    default:
        break;
    }
    return ESP_OK;
}


EventGroupHandle_t s_wifi_event_group;  //wifi事件组
/*
 * wifi初始化
 * 返回：0成功
 */
esp_err_t wifi_init_sta(void)
{
    esp_log_level_set(TAG, ESP_LOG_INFO);

    s_wifi_event_group = xEventGroupCreate();   //创建时间组

/*
    nvs_save_wifi_config(wifi_config);
    if(nvs_read_wifi_config()==ESP_FAIL)
    {
        return ESP_FAIL;
    }
*/
    ESP_LOGI(TAG, "tcp/ip install");
    tcpip_adapter_init();   //tcpip适配器初始化
    ESP_ERROR_CHECK(esp_event_loop_init(wifi_event_handler, NULL));  //初始化事件组，注册wifi事件回调函数
    ESP_LOGI(TAG, "wifi init start");
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();    //wifi配置为默认
    ESP_ERROR_CHECK(esp_wifi_init(&cfg));   //wifi初始化
    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));  //设置wifi工作在station模式

    ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));    //根据wifi_config设置esp32 wifi
    ESP_ERROR_CHECK(esp_wifi_start());  //开启wifi
    esp_wifi_set_auto_connect(true);    //开启wifi自动连接
    ESP_LOGI(TAG, "wifi_init_sta finished.");
    return ESP_OK;
}

/*
 * 更新wifi配置
*/
void wifi_update()
{
    //若wifi已连接则先断开
    if(get_wifi_status())
    {
        ESP_ERROR_CHECK(esp_wifi_disconnect());
    }
    
    ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));    //根据wifi_config重新设置wifi信息
    //ESP_ERROR_CHECK(esp_wifi_start());
    esp_wifi_connect(); //重新连接
}

/*
 * wifi连接状态查询
 * 返回：1：连接 0：未连接
 */
int get_wifi_status()
{
    //根据wifi事件组的标志位判断连接状态
    EventBits_t wifi_event_bit = xEventGroupGetBits(s_wifi_event_group);
    if(wifi_event_bit &= WIFI_CONNECTED_BIT)
    {
        return 1;
    }
    else
        return 0;
}
